﻿/*=====================================================================
  
    File:      TabularDatabase.CalculatedColumn.cs

    Summary:   This is the class that implements all related functionality 
               around CalculatedColumns in a tabular model, for all TabularDatabase 
               commandlets.
                              
 
               Tabular Database Cmdlets (TabularDatabaseCmdlets) is sample code 
               to show and explain how to use the AMO to Tabular (AMO2Tabular)
               library to build a PowerShell library of cmdlets to manage 
               Tabular model objects. 
               The sample can be seen as a sample library of cmdlets
               with the necessary code to execute each particular 
               action or operation over a logical tabular object. 

    Authors:   JuanPablo Jofre (jpjofre@microsoft.com)
    Date:	   22-Aug-2012
  
    Change history:

    @TODO: 
  
-----------------------------------------------------------------------
  
    This file is part of the Microsoft SQL Server Code Samples.
    Copyright (C) Microsoft Corporation.  All rights reserved.
  
  This source code is intended only as a supplement to Microsoft
  Development Tools and/or on-line documentation.  
  
  THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF 
  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  PARTICULAR PURPOSE.
  
======================================================================*/


using System;
using System.Globalization;
using System.Management.Automation;     //  Windows PowerShell assembly.
using MicrosoftSql2012Samples.Amo2Tabular;
using MicrosoftSql2012Samples.TabularDatabaseCmdlet.Properties;
using AMO = Microsoft.AnalysisServices;

namespace MicrosoftSql2012Samples.TabularDatabaseCmdlet
{
    [Cmdlet(VerbsCommon.Add, "CalculatedColumnToTabularTable")]
    public class AddCalculatedColumnToTabularTable : TabularDatabaseBase
    {
        //  Declare mandatory parameters
        [Parameter(Mandatory = true, Position = 2)]
        [ValidateNotNullOrEmpty]
        public string tableName { get; set; }

        [Parameter(Mandatory = true, Position = 3)]
        [ValidateNotNullOrEmpty]
        public string columnName { get; set; }

        [Parameter(Mandatory = true, Position = 4)]
        [ValidateNotNullOrEmpty]
        public string daxExpression { get; set; }


        // Declare optional parameters for the Add-CalculatedColumnToTable cmdlet.
        [Parameter]
        public string process { get; set; }

        [Parameter]
        public bool hidden { get; set; }

        [Parameter]
        public string dataFormat { get; set; }

        [Parameter]
        public string dataType { get; set; }

        [Parameter]
        public string sortByColumn { get; set; }

        // Overide the ProcessRecord method to add a Calculated Column 
        // using the supplied server name and database name 
        protected override void ProcessRecord()
        {
            //  Validate input arguments
            //  -   process string must be a valid AMO process type
            AMO.ProcessType? processType = TabularDatabaseHelperFunctions.TryParseProcessType(process);

            DataType dt = TabularDatabaseHelperFunctions.TryParseDataType(dataType);
            if (dt == DataType.Unsupported)
            {
                ThrowTerminatingError(new ErrorRecord(new ArgumentException(), string.Format(CultureInfo.InvariantCulture, Resources.InvalidDataTypeArgumentException, dataType), ErrorCategory.InvalidArgument, null));
                return;
            }
            ColumnInfo columnInfo = new ColumnInfo("", "", dt, dataFormat, "", !hidden, sortByColumn, "", null, null);

            ReportingInfo? reportingInfo = null;    // As of this version of AMO2Tabular no support for reporting properties had been implemented


            using (AMO.Server server = new AMO.Server())
            {
                try
                {
                    server.Connect(serverName);
                    using (AMO.Database database = server.Databases.GetByName(databaseName))
                    {
                        AMO2Tabular.CalculatedColumnAdd(database, tableName, columnName, daxExpression, true, columnInfo, reportingInfo, processType);
                        WriteVerbose(string.Format(CultureInfo.InvariantCulture, Resources.AddCalculatedColumnWriteReport, columnName, tableName));
                    }
                }
                catch (Exception ex)
                {
                    ThrowTerminatingError(new ErrorRecord(ex, string.Format(CultureInfo.InvariantCulture, Resources.AddCalculatedColumnTerminatingError, columnName, tableName), ErrorCategory.InvalidOperation, null));
                }
            }

        }

    }

    [Cmdlet(VerbsCommon.Get, "CalculatedColumnsInTabularTable")]
    public class GetCalculatedColumnsInTabularTable : TabularDatabaseBase
    {
        //  Declare mandatory parameters
        [Parameter(Mandatory = true, Position = 2)]
        [ValidateNotNullOrEmpty]
        public string tableName { get; set; }


        // Overide the ProcessRecord method to Get all Calculated Column names
        // using the supplied server name, database name and table
        protected override void ProcessRecord()
        {

            using (AMO.Server server = new AMO.Server())
            {
                try
                {
                    server.Connect(serverName);
                    using (AMO.Database database = server.Databases.GetByName(databaseName))
                    {
                        foreach(string columnName in AMO2Tabular.CalculatedColumnsEnumerate(database, tableName))
                        {
                            WriteObject(columnName, true);
                        }
                    }
                }
                catch (Exception ex)
                {
                    ThrowTerminatingError(new ErrorRecord(ex, string.Format(CultureInfo.InvariantCulture, Resources.GetCalculatedColumnsInTabularTableTerminatingError, tableName, databaseName), ErrorCategory.InvalidOperation, null));
                }
            }

        }

    }
}
